其實有跟老鷹答應說要幫忙連載的,不過前提是等工作穩定他會幫忙XD...
但是現在工作不穩定中又被提一次...
還是先PO好了
其實這個是我之前常用的方式
基本上我是不用框架
不過在寫SQL語法的時候也很煩XDDD
所以用點陣列方式來處理SQL語法
使用方式如下
//陣列
$data = array(
'username' => 'Bertie',
'email' => 'bertie@example.com',
);//範例,查詢資料
$sql = 'SELECT password
FROM user
WHERE ' . sql_build_array('SELECT', $data);// 範例 更新資料庫
$sql = 'UPDATE user SET ' . sql_build_array('UPDATE', $data) . ' WHERE user_id = ' . (int) $user_id;//範例,新增資料
$sql = 'INSERT INTO user ' . sql_build_array('INSERT', $data);
function code
function sql_escape($msg){
return str_replace(array("'", "\0"), array("''", ''), $msg);
}
function _sql_validate_value($var){
if (is_null($var)){
return 'NULL';
}else if (is_string($var)){
return "'" . sql_escape($var) . "'";
}else{
return (is_bool($var)) ? intval($var) : $var;
}
}
function sql_build_array($query, $assoc_ary = false){
if (!is_array($assoc_ary)){
return false;
}
$fields = $values = array();
if ($query == 'INSERT' || $query == 'INSERT_SELECT'){
foreach ($assoc_ary as $key => $var){
$fields[] = $key;
if (is_array($var) && is_string($var[0])){
// This is used for INSERT_SELECT(s)
$values[] = $var[0];
}else{
$values[] = _sql_validate_value($var);
}
}
$query = ($query == 'INSERT') ? ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')' : ' (' . implode(', ', $fields) . ') SELECT ' . implode(', ', $values) . ' ';
}else if ($query == 'MULTI_INSERT'){
trigger_error('The MULTI_INSERT query value is no longer supported. Please use sql_multi_insert() instead.', E_USER_ERROR);
}else if ($query == 'UPDATE' || $query == 'SELECT'){
$values = array();
foreach ($assoc_ary as $key => $var){
$values[] = "$key = " . _sql_validate_value($var);
}
$query = implode(($query == 'UPDATE') ? ', ' : ' AND ', $values);
}
return $query;
}
如果這是搭配 MySQL 的 code,那何不直接使用 mysql_real_escape_string() 來代替你所寫的 sql_escape() 就好了?要不然還要考慮雙字元碼或反斜線等問題,容易掛一漏萬。
這是DBAL的一部份
因為這個還算蠻早之前弄得
所以一直沿用到今日